AWS Elemental MediaConvertで入力ロケーションを制限してみた
はじめに
清水です。AWS Media Servicesの細かなアップデートを追っていくコーナーです。本エントリで紹介するのはこちら、AWS Elemental MediaConvertで入力ローケーションをポリシーを使って制御できるようになりました。2021/10/08付でAPIならびにドキュメントが更新されています。
- How to allow or disallow input location types using a policy - MediaConvert
- AWS API Changes 「2021/10/08 - AWS Elemental MediaConvert - 3 new api methods」
AWS re:Invet 2017期間中(2017年11月下旬)にAWS Media Servicesの1つとしてリリースされたAWS Elemental MediaConvert、リリース当時はそれ以前からあったAWSの動画変換サービスAmazon Elastic Transcoderと同じく、入力/出力ともAmazon S3であるという仕様でした。
その後2019年夏にMediaConvertのアップデートとして、HTTPS/HTTPの入力ソースに対応しました。変換したい元ファイル(元の映像ソース)がAWS、S3の外にある場合など、それまではいちどS3にコピーする必要がありましたが、直接MediaConvertの入力ソースとすることが可能になりました。
MediaConvetの入力ソースはS3/HTTPS/HTTPの3種をサポートしているのが現在の状況です。今回のアップデートではこの3種の入力ソースについて、各々を使用するかしないかの制御ができるようになりました。例えば、入力ソースにHTTPは使用したくないのでS3とHTTPSのみを有効にする、従来と同じように入力ソースはS3のみからとする(HTTPSとHTTPは入力ソースとして使用しないよう制限する)、といったことが可能です。
設定についてはポリシーを作成して、AWSアカウント内のリージョン単位で適用します。2021/10/25現在のところAWSマネジメントコンソールからの設定はサポートしておらず、APIもしくはAWS CLIからの操作となります。本エントリでは実際にAWS CLIでこのポリシーを設定、動作を確認してみたのでまとめてみます。
MediaConvertのポリシーで入力ソースを制限してみた
それでは実際にMediaConvertにポリシーを適用し、入力ソースを制限してみたいと思います。ポリシーの操作は以下環境のAWS CLIで実行しました。
% aws --version aws-cli/2.3.0 Python/3.8.8 Darwin/20.6.0 exe/x86_64 prompt/off
MediaConvertのendpointの確認
MediaConvertをAPI(含むAWS CLI)で操作する場合、アカウント個別のendpointを指定する必要があります。
事前にこちらを確認しておきましょう。aws mediaconvert describe-endpoints
を使用します。
% aws mediaconvert describe-endpoints \ --region ap-northeast-1 { "Endpoints": [ { "Url": "https://mpazxxxxx.mediaconvert.ap-northeast-1.amazonaws.com" } ] }
Urlの値となっているのがendpointです。以降、AWS CLI実行時にこちらのendpointを--endpoint-url
オプションで指定していきます。
MediaConvertポリシーの設定状況の確認
MediaConvertにポリシーを設定する前に、まずはポリシーの状態を確認しておきましょう。といってもなにも設定していなければポリシーは空の状態です。aws mediaconvert get-policy
コマンドを実行してみます。
% aws mediaconvert get-policy \ --region ap-northeast-1 \ --endpoint-url https://mpazxxxxx.mediaconvert.ap-northeast-1.amazonaws.com An error occurred (NotFoundException) when calling the GetPolicy operation: Your account does not have a policy.
エラーメッセージとともに、ポリシーが空であることがわかりました。
HTTP入力を禁止してみる
では実際にMediaConvertにポリシーを設定し、入力ソースの種別を制限していきます。まずは3つの入力ソース種別のうち、HTTPを禁止するポリシーを設定してみます。ポリシーの設定にはaws mediaconvert put-policy
コマンドを使用します。ポリシーについては、--policy
オプションに続いてJSON形式で記述します。
ポリシーは以下の形式で、3つの要素S3Inputs
、HttpsInputs
、HttpInputs
に対して、ALLOWED
もしくはDISALLOWED
を指定します。
{ "S3Inputs": "ALLOWED|DISALLOWED", "HttpsInputs": "ALLOWED|DISALLOWED", "HttpInputs": "ALLOWED|DISALLOWED" }
実際に実行してみます。put-policy
コマンドの返り値としては実際に設定されたポリシーが返ります。
% aws mediaconvert put-policy \ --policy '{"S3Inputs":"ALLOWED", "HttpsInputs":"ALLOWED", "HttpInputs":"DISALLOWED"}' \ --region ap-northeast-1 \ --endpoint-url https://mpazxxxxx.mediaconvert.ap-northeast-1.amazonaws.com { "Policy": { "HttpInputs": "DISALLOWED", "HttpsInputs": "ALLOWED", "S3Inputs": "ALLOWED" } }
この状態でget-policy
コマンドでポリシーを確認してみます。
% aws mediaconvert get-policy \ --region ap-northeast-1 \ --endpoint-url https://mpazxxxxx.mediaconvert.ap-northeast-1.amazonaws.com { "Policy": { "HttpInputs": "DISALLOWED", "HttpsInputs": "ALLOWED", "S3Inputs": "ALLOWED" } }
ポリシーが設定されていますね。この状態で入力ソースをHTTPとしてジョブを作成しようとしてみます。AWSマネジメントコンソールからCreate jobで[Create]ボタンを押してみましたが、以下のように「You specified an input location that your policy disallows. Specify an allowed input location and resubmit your job.」というメッセージが表れ、ジョブの作成ができませんでした。きちんとHTTPの入力が制限されていますね。
S3入力を禁止してみる
続いてはS3を入力ソースとして使用することを禁止してみたいと思います。(実際にこれはレアなケースだとは思いますが、検証ということで。)以下のようにS3Inputs
をDISALLOWED
、HttpsInputs
とHttpInputs
をALLOWED
としたJSONを指定してput-policy
コマンドを実行します。
% aws mediaconvert put-policy \ --policy '{"S3Inputs":"DISALLOWED", "HttpsInputs":"ALLOWED", "HttpInputs":"ALLOWED"}' \ --region ap-northeast-1 \ --endpoint-url https://mpazxxxxx.mediaconvert.ap-northeast-1.amazonaws.com { "Policy": { "HttpInputs": "ALLOWED", "HttpsInputs": "ALLOWED", "S3Inputs": "DISALLOWED" } }
get-policy
コマンドで設定状態を確認します。S3の入力が禁止されている状態ですね。
% aws mediaconvert get-policy \ --region ap-northeast-1 \ --endpoint-url https://mpazxxxxx.mediaconvert.ap-northeast-1.amazonaws.com { "Policy": { "HttpInputs": "ALLOWED", "HttpsInputs": "ALLOWED", "S3Inputs": "DISALLOWED" } }
この状態で、入力ソースをS3に指定したジョブを作成しようとすると、先ほどと同じように「You specified an input location that your policy disallows. Specify an allowed input location and resubmit your job.」のメッセージでジョブの作成ができません。
ただしS3については、オブジェクトを公開状態にしていればHTTPS/HTTPでのアクセスも可能ですね。例えばs3://
でS3 URIの形式で入力ソースを指定するのではなく、https://
ではじまるObject URL(ドメイン名が[バケット名].s3.ap-northeast-1.amazonaws.comのもの)を使用すれば、ジョブの作成が可能になります。これはMediaConvert側からはS3ではなくHTTPSの入力ソースとして見ているわけですね。(入力ソースをS3とする(s3://
で指定する)場合は、MediaConvertのジョブに設定したIAMロールでアクセスするなどの条件が異なるのかな、などと推測しています。)
MediaConvertのポリシーを削除する
最後に、今回設定したMediaConvertのポリシーを削除しておきます。削除はaws mediaconvert delete-policy
コマンドで実行します。
コマンド実行時の返り値は特にありません。
% aws mediaconvert delete-policy \ --region ap-northeast-1 \ --endpoint-url https://mpazxxxxx.mediaconvert.ap-northeast-1.amazonaws.com
実行後は、ポリシーが空になっているか確認しておきましょう。
% aws mediaconvert get-policy \ --region ap-northeast-1 \ --endpoint-url https://mpazxxxxx.mediaconvert.ap-northeast-1.amazonaws.com An error occurred (NotFoundException) when calling the GetPolicy operation: Your account does not have a policy.
まとめ
AWS Elemental MediaConvertでポリシーを設定して入力ソースのロケーションを制限してみました。S3以外の入力ソースが使えるアップデートも大変うれしいアップデートでしたが、今回はそれにあえて制限ができるようになるという、かゆいところに手が届くというか、非常に設定の柔軟性をもたらしてくれるアップデートだなと思いました。実際の使用例としては、暗号化されていないHTTPを禁止しておいたり、HTTPS/HTTP双方を禁止して(従来のような)S3からの入力に限定したり、といったケースかなと思います。適用はAWSアカウント内のリージョン単位での適用になる点には注意しましょう。